package com.air.mapper;


import com.air.annotation.AutoFill;
import com.air.dto.PassengerPageQueryDTO;
import com.air.dto.PassengerRegisterDTO;
import com.air.entity.Passenger;
import com.air.enumeration.OperationType;
import com.air.vo.PassengerVO;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface PassengerMapper {

    /**
     * 注册新旅客信息到数据库。
     *
     * 通过@Insert注解指定了插入旅客信息的SQL语句，该语句用于将新旅客的各项信息插入到passenger表中。
     * 使用了MyBatis的动态SQL标签#{}, 它们会动态地替换为方法参数的值。
     *
     * @param passenger 一个Passenger对象，包含新旅客的所有信息。
     *                  该对象的属性将被映射到SQL语句中的对应字段，实现数据的插入。
     *
     * @AutoFill注解用于自动填充创建时间和更新时间字段，通过指定OperationType.INSERT，
     * 在插入数据时自动为这些字段赋上当前的时间值，避免手动设置。
     */
        @Insert("insert into passenger(name, username, password, phone, sex, id_number, create_time, update_time) " +
                "VALUES " +
                "(#{name},#{username},#{password},#{phone},#{sex},#{idNumber},#{createTime},#{updateTime})")
        @AutoFill(value = OperationType.INSERT)
        void insert(Passenger passenger);


    /**
     * 根据用户名查询旅客信息。
     *
     * 本方法通过查询数据库中的passenger表，根据提供的用户名来获取对应的旅客信息。
     *
     * @param username 查询所用的用户名，作为数据库查询的条件。
     * @return 返回与给定用户名匹配的旅客对象。如果不存在匹配的旅客，则返回null。
     */
    @Select("select * from passenger where username=#{username}")
    Passenger getByUsername(String username);


    /**
     * 分页查询乘客信息
     *
     * 本函数旨在根据提供的查询条件，进行乘客信息的分页查询。查询结果将包含乘客的详细信息，
     * 以便于进一步的业务处理或展示。
     *
     * @param passengerPageQueryDTO 包含查询条件和分页信息的数据传输对象。此对象应包含用于
     *                               筛选乘客信息的条件，如乘客姓名、身份证号等，以及分页相关的信息，
     *                               如页码、每页显示数量等。
     * @return 返回一个Page<PassengerVO>对象，其中包含了查询结果的乘客信息和分页信息。Page对象是一个
     *         分页结果的容器，它不仅包含了查询到的乘客信息（PassengerVO类型），还包含了当前页码、
     *         总页数、每页显示数量等分页相关信息。
     */
    Page<PassengerVO> pageQuery(PassengerPageQueryDTO passengerPageQueryDTO);


    /**
     * 根据乘客ID查询乘客信息。
     *
     * 此方法通过指定的ID从数据库中检索乘客的详细信息。ID是乘客信息的唯一标识。
     * 使用@Select注解指定了SQL查询语句，其中#{id}是占位符，用于动态插入方法参数ID。
     *
     * @param id 乘客的唯一标识符。
     * @return 匹配指定ID的乘客信息对象。如果找不到匹配的乘客，则返回null。
     */
    @Select("select * from passenger where id=#{id}")
    PassengerVO getById(Long id);


    /**
     * 修改旅客信息的方法。
     * 通过传递Passenger对象来更新数据库中的旅客记录。此方法利用@AutoFill注解自动填充操作类型为UPDATE，
     *
     * @param passenger 包含更新后旅客信息的对象。此对象的属性将用于更新数据库中的相应旅客记录。
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Passenger passenger);

}
